package week_4.practice;

import java.io.*;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;


/*代表一个学习项目，一个学生计划学习的一系列课程*/
public class ProgramOfStudy implements Iterable<Course>,Serializable {
    private List<Course> list;
    /*构造一个初始为空的学习项目*/
    public ProgramOfStudy()
    {
        list = new LinkedList<Course>();
    }
    /*将特定的课程添加到课程列表末尾*/
    public void addCourse(Course course)
    {
        if(course!=null)
            list.add(course);
    }
    /*找到并返回有特定前缀和数字的课程*/
    public Course find(String prefix,int number)
    {
        for(Course course:list)
            if(prefix.equals(course.getPrefix())&& number==course.getNumber())
                return course;

        return null;
    }
    /*将特定课程添加到目标课程之后，如果特定课程为空或者没有找到目标课程就什么都不做*/
    public void addCourseAfter(Course target,Course newCourse)
    {
        if(target == null || newCourse == null)
            return;

        int targetIndex= list.indexOf(target);
        if(targetIndex != -1)
            list.add(targetIndex + 1,newCourse);
    }
    /*用新的课程来替换特定的目标课程，如果该课程为空或者没有找到目标课程就什么都不做*/
    public void replace(Course target,Course newCourse)
    {
        if(target == null || newCourse == null)
            return;

        int targetIndex= list.indexOf(target);
        if(targetIndex != -1)
            list.set(targetIndex ,newCourse);
    }
    /*创建并返回一个代表这个学习项目的字符串*/
    public String toString()
    {
        String result = "";
        for(Course course : list)
          result += course + "\n";
        return result;
    }
    /*返回一个学习项目的迭代器*/
    public Iterator<Course> iterator()
    {
        return list.iterator();
    }
    /*保存一个根据特定文件名称的序列化学习项目列表*/
    public void save(String filename) throws IOException
    {
        FileOutputStream fos = new FileOutputStream(filename);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(this);
        oos.flush();
        oos.close();
    }
    /*加载一个来自特定文件的序列化学习项目列表*/
    public static ProgramOfStudy load(String fileName) throws IOException,ClassNotFoundException
    {
        FileInputStream fis = new FileInputStream(fileName);
        ObjectInputStream ois = new ObjectInputStream(fis);
        ProgramOfStudy pos = (ProgramOfStudy)ois.readObject();
        ois.close();

        return pos;
    }
}
